iT邦幫忙

2024 iThome 鐵人賽

DAY 5
0
Kubernetes

K8s 資料庫管理系統系列 第 5

day 5 k8s 資料庫管理大賣場系統

  • 分享至 

  • xImage
  •  

今天是第五天我們可以寫一個k8s資料庫管理大賣場系統,以下是我的程式碼

系統架構

  1. Kubernetes 部署環境: K8s 集群負責管理應用程式、資料庫及其依賴資源。
  2. 資料庫: 使用 PostgreSQL 或 MySQL 作為核心資料庫來處理大賣場的數據。
  3. 應用層: 使用 Node.js, Python, 或 Java 開發 RESTful API,處理客戶訂單、商品管理、庫存跟蹤等功能。
  4. 服務調度: K8s 中的 Service 提供資料庫與應用層之間的通信接口。

基本步驟

1. 設定 Kubernetes 集群

  • 準備一個 Kubernetes 集群(可以是本地 Minikube,或使用 GCP, AWS 等雲服務平台的 K8s 服務)。

2. 部署資料庫(以 PostgreSQL 為例)

  • 首先我們需要一個持久性存儲來保存資料庫數據,這裡可以使用 PVC(PersistentVolumeClaim)。
2.1 建立 PersistentVolumeClaim (PVC)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
2.2 部署 PostgreSQL StatefulSet

StatefulSet 確保每個副本的資料庫有穩定的網絡標識及持久存儲。

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgres
spec:
  serviceName: postgres
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - name: postgres
        image: postgres:latest
        ports:
        - containerPort: 5432
        env:
        - name: POSTGRES_DB
          value: "store_db"
        - name: POSTGRES_USER
          value: "admin"
        - name: POSTGRES_PASSWORD
          value: "password"
        volumeMounts:
        - name: postgres-storage
          mountPath: /var/lib/postgresql/data
  volumeClaimTemplates:
  - metadata:
      name: postgres-storage
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 10Gi
2.3 建立 PostgreSQL Service
apiVersion: v1
kind: Service
metadata:
  name: postgres
spec:
  ports:
  - port: 5432
    name: postgres
  clusterIP: None
  selector:
    app: postgres

3. 部署應用層

假設使用 Node.js 搭配 Express,應用將與資料庫交互,處理大賣場的業務邏輯,如庫存管理、訂單處理等。

3.1 應用 Dockerfile

將應用打包成容器,並部署到 Kubernetes。

FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
3.2 應用部署檔案
apiVersion: apps/v1
kind: Deployment
metadata:
  name: store-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: store-app
  template:
    metadata:
      labels:
        app: store-app
    spec:
      containers:
      - name: store-app
        image: your-repo/store-app:latest
        ports:
        - containerPort: 3000
        env:
        - name: DB_HOST
          value: "postgres"
        - name: DB_USER
          value: "admin"
        - name: DB_PASSWORD
          value: "password"
        - name: DB_NAME
          value: "store_db"
3.3 應用服務
apiVersion: v1
kind: Service
metadata:
  name: store-service
spec:
  selector:
    app: store-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 3000
  type: LoadBalancer

4. 配置 Ingress 訪問(可選)

透過 Ingress 來暴露應用外部訪問端點。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: store-ingress
spec:
  rules:
  - host: store.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: store-service
            port:
              number: 80

優化與擴展

  1. 橫向擴展: K8s 自動擴展 Replica 來支撐流量高峰。
  2. 監控: 使用 Prometheus 和 Grafana 來監控資源消耗與效能。
  3. CI/CD: 結合 Jenkins 或 GitLab CI 自動化部署更新。

1. PersistentVolumeClaim (PVC)

這段程式碼負責申請存儲空間,用於資料庫的持久性存儲。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

解釋:

  • PersistentVolumeClaim: 在 Kubernetes 中,PVC 用來向 Kubernetes 集群申請一塊持久性存儲,用來存儲資料庫數據,避免 Pod 重啟時資料丟失。
  • name: postgres-pvc: 定義這個 PVC 的名稱為 postgres-pvc,後面將引用它。
  • accessModes: 指定存取模式,ReadWriteOnce 代表此存儲卷只能被一個節點同時讀寫。
  • requests.storage: 申請了 10GB 的存儲空間。

2. PostgreSQL StatefulSet

這段程式碼用來部署 PostgreSQL 資料庫,確保資料庫的資料持久化,並且在重啟後依然保留數據。

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgres
spec:
  serviceName: postgres
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - name: postgres
        image: postgres:latest
        ports:
        - containerPort: 5432
        env:
        - name: POSTGRES_DB
          value: "store_db"
        - name: POSTGRES_USER
          value: "admin"
        - name: POSTGRES_PASSWORD
          value: "password"
        volumeMounts:
        - name: postgres-storage
          mountPath: /var/lib/postgresql/data
  volumeClaimTemplates:
  - metadata:
      name: postgres-storage
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 10Gi

解釋:

  • StatefulSet: 為有狀態的應用程式設計,確保資料庫有固定的名稱和網絡標識,即使重啟也不會改變。
  • replicas: 1: 部署一個 PostgreSQL 資料庫副本,可以根據需求調整為多副本。
  • template.metadata.labels: 用來標記這個 Pod,這裡是 app: postgres,後續的 Service 會根據這個標籤找到對應的 Pod。
  • image: postgres:latest: 指定使用 PostgreSQL 的最新版本映像。
  • containerPort: 5432: 指定 PostgreSQL 的默認端口,5432 是 PostgreSQL 預設的數據庫通信端口。
  • env: 設定 PostgreSQL 資料庫的環境變數,包括資料庫名稱 (POSTGRES_DB),用戶名 (POSTGRES_USER),以及密碼 (POSTGRES_PASSWORD)。
  • volumeMounts: 把之前的 PVC(postgres-storage)掛載到容器的 /var/lib/postgresql/data 目錄,這是 PostgreSQL 用來存儲數據的地方,保證資料不會因為容器重啟而丟失。
  • volumeClaimTemplates: 定義存儲卷模版,確保每個 PostgreSQL 副本都有自己獨立的存儲空間。

3. PostgreSQL Service

這段程式碼是用來提供 PostgreSQL 的網路服務,使其他 Pod 能夠通過這個 Service 與 PostgreSQL 進行通訊。

apiVersion: v1
kind: Service
metadata:
  name: postgres
spec:
  ports:
  - port: 5432
    name: postgres
  clusterIP: None
  selector:
    app: postgres

解釋:

  • Service: Kubernetes 中的 Service 負責為 Pod 提供一個穩定的網絡接口,無論 Pod 重啟或是更新,應用都可以通過這個接口來訪問它。
  • port: 5432: Service 對外暴露 PostgreSQL 的端口 5432,使其他應用可以通過這個端口連接資料庫。
  • clusterIP: None: 表示這是一個 headless service,與 StatefulSet 一起使用,允許直接連接到 Pod。
  • selector: 指定這個 Service 要連接的 Pod(標籤為 app: postgres 的 Pod)。

4. 應用層 Deployment

這段程式碼定義了大賣場的應用層,使用 Node.js 並與資料庫進行交互。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: store-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: store-app
  template:
    metadata:
      labels:
        app: store-app
    spec:
      containers:
      - name: store-app
        image: your-repo/store-app:latest
        ports:
        - containerPort: 3000
        env:
        - name: DB_HOST
          value: "postgres"
        - name: DB_USER
          value: "admin"
        - name: DB_PASSWORD
          value: "password"
        - name: DB_NAME
          value: "store_db"

解釋:

  • Deployment: 負責管理應用程式的多副本部署。當某個應用崩潰或需要更新時,Deployment 會確保應用程式保持可用。
  • replicas: 3: 定義了 3 個應用副本(Pod)來保證高可用性。如果有 Pod 崩潰,Kubernetes 會自動重新啟動一個新的 Pod。
  • image: your-repo/store-app:latest: 指定應用使用的容器映像。可以將你的 Node.js 應用打包成 Docker 映像,並推送到容器註冊庫(例如 Docker Hub),然後在這裡引用它。
  • containerPort: 3000: 指定應用運行的端口,這裡是 3000(Node.js 應用常用的端口)。
  • env: 設定資料庫的連接信息,DB_HOST 為資料庫服務的地址(即我們之前定義的 postgres Service),其他環境變數包括資料庫用戶、密碼和名稱。

5. 應用層 Service

這段程式碼為應用程式創建一個 LoadBalancer,使外部用戶可以訪問應用。

apiVersion: v1
kind: Service
metadata:
  name: store-service
spec:
  selector:
    app: store-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 3000
  type: LoadBalancer

解釋:

  • Service: 同樣是一個 Kubernetes 服務,用來將應用層暴露給外部用戶訪問。
  • port: 80: 這裡指定 Service 對外暴露的端口是 80,這是網頁服務常用的端口。
  • targetPort: 3000: 這裡的 3000 是應用程式內部的端口,這意味著 Service 接收的流量將被轉發到應用的 3000 端口。
  • type: LoadBalancer: 定義服務類型為 LoadBalancer,這會在雲平台上自動創建負載均衡器,將外部流量分配到多個應用副本。

6. Ingress 設定 (可選)

Ingress 用來設定應用的域名和路徑路由,允許外部用戶通過指定的域名來訪問應用。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: store-ingress
spec:
  rules:
  - host: store.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: store-service
            port:
              number: 80

解釋:

  • Ingress: 這個資源允許你通過域名 (store.example.com) 將外部請求路由到 Kubernetes 內部的服務(store-service)。
  • host: 指定了訪問應用的域名,這需要和 DNS 設置一起使用。
  • path: 定義了當用戶訪問 / 路徑時,流量應該被轉發到 store-service 的 80 端口。

總結

PVC**: 為 PostgreSQL 資料庫申請 10GB 的持久性存儲。

  • StatefulSet: 部署 PostgreSQL 資料庫,確保其數據持久化並有穩定的網絡標識。
  • Service (Postgres): 為資料庫創建網絡服務,使應用層可以與之交互。
  • Deployment: 部署應用程式(Node.js),與資料庫進行交互。
  • Service (Store App): 將應用層暴露給外部用戶,使用 LoadBalancer 分配流量。
  • Ingress (可選): 設定應用的域名和路徑路由。

上一篇
day 4 K8s 資料庫模仿google存取資料系統
下一篇
day 6 k8s 大型公司備份商業機密資料庫管理系統
系列文
K8s 資料庫管理系統30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言